#include "Date.h"

Date::Date(int year, int month, int day)
{
    _year = year;
    _month = month;
    _day = day;
}

bool Date::operator==(const Date &d) const
{
    return _year == d._year &&
           _month == d._month &&
           _day == d._day;
}

bool Date::operator!=(const Date &d) const
{
    return !(*this == d);
}

bool Date::operator>(const Date &d) const
{
    return !(*this < d);
}

bool Date::operator<(const Date &d) const
{
    if (_year < d._year)
    {
        return true;
    }

    else if (_year == d._year)
    {
        if (_month < d._month)
        {
            return true;
        }
        else if (_month == d._month)
        {
            if (_day < d._day)
            {
                return true;
            }
        }
    }
    return false;
}

bool Date::operator<=(const Date &d) const
{
    return *this < d || *this == d;
}

bool Date::operator>=(const Date &d) const
{
    return (*this > d) || (*this == d);
}

Date &Date::operator=(const Date &d)
{
    if (this != &d)
    {
        _year = d._year;
        _month = d._month;
        _day = d._day;
    }
    return *this;
}

Date Date::operator+(int day) const
{
    // Date tmp(*this);
    // tmp._day += day;
    // while (tmp._day > GetMonthDay(tmp._year, tmp._month))
    // {
    //     tmp._day -= GetMonthDay(tmp._year, tmp._month);
    //     tmp._month++;
    //     if (tmp._month == 13)
    //     {
    //         tmp._year++;
    //         tmp._month = 1;
    //     }
    // }
    // return tmp;
    Date tmp(*this);
    tmp += day;
    return tmp;
}

Date &Date::operator+=(int day)
{
    _day += day;
    while (_day > GetMonthDay(_year, _month))
    {
        _day -= GetMonthDay(_year, _month);
        _month++;
        if (_month == 13)
        {
            _year++;
            _month = 1;
        }
    }
    return *this;
    // *this = *this + day;
    // return *this;
}

Date &Date::operator-=(int day)
{
    _day -= day;
    while (_day <= 0)
    {
        --_month;
        if (_month == 0)
        {
            --_year;
            _month = 12;
        }
        _day += GetMonthDay(_year, _month);
    }
    return *this;
}

Date Date::operator-(int day) const
{
    Date tmp = *this;
    tmp -= day;
    return tmp;
}

Date &Date::operator++()
{
    *this += 1;
    return *this;
}

Date Date::operator++(int)
{
    Date tmp = *this;
    *this += 1;
    return tmp;
}

ostream &operator<<(ostream &_cout, const Date &d)
{
    _cout << d._year << "-" << d._month << "-" << d._day << endl;
    return _cout;
}

// void Date::operator<<(ostream &_cout)
// {
//     _cout << _year << "-" << _month << "-" << _day << endl;
// }